/*
 * Copyright 2008 Karel Klic.
 * This file is part of Oslavanský Bot.
 * 
 * Oslavanský Bot is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.

 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package categorybot;

import java.util.*;
import java.util.regex.*;

/**
 * Vytvari seznam jazyku a jejich tvaru.
 */
public class LanguageFactory {
  
  static ArrayList<String> buildBasicTypeIdList(String... typeIds) {
    ArrayList<String> typeIdList = new ArrayList<String>();
    for (String typeId : typeIds) {
      typeIdList.add(typeId);
      typeIdList.add(typeId + " (1)");typeIdList.add(typeId + " (2)");
      typeIdList.add(typeId + " (3)");typeIdList.add(typeId + " (4)");
      typeIdList.add(typeId + " (5)");typeIdList.add(typeId + " (6)");
      typeIdList.add(typeId + " (7)");typeIdList.add(typeId + " (8)");
    }
    return typeIdList;
  }
  
  /**
   * Creates Language data.
   * @param name
   * Name of the language, eg. angličtina.
   * @param aForm
   * Form of the name, Anglická
   * @param eForm
   * Form of the name, Anglické
   * @return
   */
  static Language createStandardLanguage(String name, String form) {
    ArrayList<String> substantivum = buildBasicTypeIdList("podstatné jméno",
            "vlastní jméno", "sousloví přídavného a podstatného jména");
    ArrayList<String> adjektivum = buildBasicTypeIdList("přídavné jméno");
    ArrayList<String> citoslovce = buildBasicTypeIdList("citoslovce");
    ArrayList<String> prislovce = buildBasicTypeIdList("příslovce");
    ArrayList<String> zkratka = buildBasicTypeIdList("zkratka", 
            "zkratkové slovo", "akronym");
    ArrayList<String> zajmeno = buildBasicTypeIdList("zájmeno", 
            "zájmeno osobní", "zájmeno tázací", "zájmeno vztažné", 
            "zájmeno přivlastňovací");
    ArrayList<String> sloveso = buildBasicTypeIdList("sloveso");
    ArrayList<String> predlozka = buildBasicTypeIdList("předložka");
    ArrayList<String> spojka = buildBasicTypeIdList("spojka", "spojovací výraz");
    ArrayList<String> castice = buildBasicTypeIdList("částice");
    ArrayList<String> cislovka = buildBasicTypeIdList("číslovka");
    ArrayList<String> clen = buildBasicTypeIdList("člen");

    
    ArrayList<Pattern> ignoreRemoveList = new ArrayList<Pattern>();
    // If any of the provided patterns matches any part of the language
    // section of the text, the language will not include removal requests to
    // the result of solveWord call.
    ignoreRemoveList.add(PatternFactory.getHeader3Pattern("slovní spojení"));
    
    Language lang = new Language(name, ignoreRemoveList)
            .add(substantivum, form + "á substantiva", form + "é tvary substantiv")
            .add(adjektivum, form + "á adjektiva", form + "é tvary adjektiv")
            .add(citoslovce, form + "á citoslovce", form + "é tvary citoslovcí")
            .add(prislovce, form + "á příslovce", form + "é tvary příslovcí")
            .add(sloveso, form + "á slovesa", form + "é tvary sloves")
            .add(zajmeno, form + "á zájmena", form + "é tvary zájmen")
            .add(predlozka, form + "é předložky", form + "é tvary předložek")
            .add(spojka, form + "é spojky", form + "é tvary spojek")
            .add(zkratka, form + "é zkratky", form + "é tvary zkratek")
            .add(castice, form + "é částice", form + "é tvary částic")
            .add(cislovka, form + "é číslovky", form + "é tvary číslovek")
            .add(clen, form + "é členy", form + "é tvary členů");
    // Nasledujici tvary se nesmi pridat, nefunguji. Nadpis slovni spojeni i 
    // nadpis fraze se pouzivat i na neco jineho nez jako urceni slovniho druhu.
    //.add("slovní spojení", form + "á slovní spojení", form + "é tvary slovních spojení")
    //.add("fráze", form + "á slovní spojení", form + "é tvary slovních spojení");
    return lang;
  }

  static ArrayList<Language> createLanguageList() {
    ArrayList<Language> ret = new ArrayList<Language>();
    ret.add(createStandardLanguage("abcházština", "Abcházsk"));
    ret.add(createStandardLanguage("afarština", "Afarsk"));
    ret.add(createStandardLanguage("afrikánština", "Afrikánsk"));
    ret.add(createStandardLanguage("ajmarština", "Ajmarsk"));
    ret.add(createStandardLanguage("angličtina", "Anglick"));
    ret.add(createStandardLanguage("arabština", "Arabsk"));
    ret.add(createStandardLanguage("běloruština", "Bělorusk"));
    ret.add(createStandardLanguage("bosenština", "Bosensk"));
    ret.add(createStandardLanguage("bretonština", "Bretonsk"));
    ret.add(createStandardLanguage("bulharština", "Bulharsk"));
    ret.add(createStandardLanguage("čeština", "Česk"));
    ret.add(createStandardLanguage("dánština", "Dánsk"));
    ret.add(createStandardLanguage("esperanto", "Esperantsk"));
    ret.add(createStandardLanguage("estonština", "Estonsk"));
    ret.add(createStandardLanguage("finština", "Finsk"));
    ret.add(createStandardLanguage("fidžijština", "Fidžijsk"));
    ret.add(createStandardLanguage("francouzština", "Francouzsk"));
    ret.add(createStandardLanguage("fríština", "Frísk"));
    ret.add(createStandardLanguage("hebrejština", "Hebrejsk"));
    ret.add(createStandardLanguage("italština", "Italsk"));
    ret.add(createStandardLanguage("japonština", "Japonsk"));
    ret.add(createStandardLanguage("katalánština", "Katalánsk"));
    ret.add(createStandardLanguage("latina", "Latinsk"));
    ret.add(createStandardLanguage("lotyština", "Lotyšsk"));
    ret.add(createStandardLanguage("maďarština", "Maďarsk"));
    ret.add(createStandardLanguage("němčina", "Německ"));
    ret.add(createStandardLanguage("nizozemština", "Nizozemsk"));
    ret.add(createStandardLanguage("norština", "Norsk"));
    ret.add(createStandardLanguage("okcitánština", "Okcitánsk"));
    ret.add(createStandardLanguage("portugalština", "Portugalsk"));
    ret.add(createStandardLanguage("rumunština", "Rumunsk"));
    ret.add(createStandardLanguage("ruština", "Rusk"));
    ret.add(createStandardLanguage("řečtina", "Řeck"));
    ret.add(createStandardLanguage("slovenština", "Slovensk"));
    ret.add(createStandardLanguage("slovinština", "Slovinsk"));
    ret.add(createStandardLanguage("srbština", "Srbsk"));
    ret.add(createStandardLanguage("španělština", "Španělsk"));
    ret.add(createStandardLanguage("švédština", "Švédsk"));
    ret.add(createStandardLanguage("turečtina", "Tureck"));
    ret.add(createStandardLanguage("velština", "Velšsk"));
    return ret;
  }
}
